package org.hawk.gwt.ppc.parser.impl;

import java.io.InputStream;
import java.util.List;

import junit.framework.TestCase;

import org.hawk.gwt.ppc.parser.ConstructorDescriptor;
import org.hawk.gwt.ppc.parser.JavaParser;
import org.hawk.gwt.ppc.parser.impl.mock.ConstructorMock;
import org.hawk.gwt.ppc.utils.Name;
import org.hawk.gwt.ppc.utils.PreprocessorException;

public class ConstructorDescriptorTestCase extends TestCase {
	
	public void testNoParameters() throws PreprocessorException {
		ConstructorDescriptor constructor = getConstructors(ConstructorMock.class.getName()).get(0);
		assertNotNull(constructor);
		assertEquals(1, constructor.getModifiers().size());
		assertEquals("private", constructor.getModifiers().get(0));
		assertEquals(0, constructor.getParameters().size());
		assertFalse(constructor.isVarArgs());
		assertNotNull(constructor.getBody());
	}
	
	public void testWithParameters() throws PreprocessorException {
		ConstructorDescriptor constructor = getConstructors(ConstructorMock.class.getName()).get(1);
		
		assertNotNull(constructor);
		assertEquals(1, constructor.getModifiers().size());
		assertEquals("public", constructor.getModifiers().get(0));
		assertEquals(2, constructor.getParameters().size());
		
		assertEquals("a", constructor.getParameters().get(0).getName());
		assertEquals("int", constructor.getParameters().get(0).getType());
		assertEquals(0, constructor.getParameters().get(0).getModifiers().size());

		assertEquals("b", constructor.getParameters().get(1).getName());
		assertEquals("String", constructor.getParameters().get(1).getType());
		assertEquals(0, constructor.getParameters().get(1).getModifiers().size());
		
		assertFalse(constructor.isVarArgs());
		
		assertNotNull(constructor.getBody());
	}
	
	public void testWithVarArgsParameters() throws PreprocessorException {
		ConstructorDescriptor constructor = getConstructors(ConstructorMock.class.getName()).get(2);
		
		assertNotNull(constructor);
		assertEquals(1, constructor.getModifiers().size());
		assertEquals("public", constructor.getModifiers().get(0));
		assertEquals(2, constructor.getParameters().size());
		
		assertEquals("impl", constructor.getParameters().get(0).getName());
		assertEquals("ConstructorMock", constructor.getParameters().get(0).getType());
		assertEquals(0, constructor.getParameters().get(0).getModifiers().size());

		assertEquals("params", constructor.getParameters().get(1).getName());
		assertEquals("int[]", constructor.getParameters().get(1).getType());
		assertEquals(0, constructor.getParameters().get(1).getModifiers().size());
		
		assertTrue(constructor.isVarArgs());
		
		assertNotNull(constructor.getBody());
	}
	
	private List<ConstructorDescriptor> getConstructors(String className) throws PreprocessorException {
		InputStream cu = getClass().getClassLoader().getResourceAsStream(Name.javaToFs(className));
		try {
			JavaParser parser = JavaParser.create(cu);
			return parser.parse().getTopClasses().get(0).getConstructors();
		} finally {
			try {
				cu.close();
			} catch(Exception ex) {
			}
		}
	}
}
